package com.zzw.springboot.lambda;

import com.zzw.springboot.bean.SysUser;

/**
 * @author 赵志伟
 * @version 1.0
 */
@SuppressWarnings({"all"})
public class Test {
    public static void main(String[] args) {
        //传统的方法来实现ZzwFuntcion接口, 使用匿名内部类, 得到一个实现接口的对象
        /**
         * class Test$1 implements ZzwFunction<AClass, Object> {
         *     public Object apply (Aclass aclass) {
         *          return "Aclass";
         *     }
         * }
         * Test$1 test$1 = new Test$1();
         * test$1.apply(new Aclass());
         */
        //ZzwFunction<AClass, String> zf = new ZzwFunction<AClass, String>() {
        //    @Override
        //    public String apply(AClass aClass) {
        //        return "AClass";
        //    }
        //};
        //Object result = zf.apply(new AClass());
        //System.out.println("result=" + result);
        ZzwFunction<AClass, String> zf2 = AClass::getBrand;
        Object result2 = zf2.apply(new AClass());
        System.out.println("result2=" + result2);
        //zf2.say();
    }
}

//定义一个函数式接口: 有且只有一个抽象方法的接口
//可以使用@FunctionalInterface 来标识一个函数式接口
//ZzwFunction是一个函数式接口(这个是一个自定义泛型接口)
@FunctionalInterface
interface ZzwFunction<T,R> {
    R apply(T t);//抽象方法: 表示根据类型T的参数, 获取类型R的结果

    //函数式接口, 依然可以有多个默认是先方法
    default public void say() {
        System.out.println("hello");
    }
}

class AClass {//Bean
    private String name = "lambda AClass";

    private String brand = "奔驰品牌";

    public String getName() {
        return name;
    }

    public String getBrand() {
        return brand;
    }
}
